Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

18-miniron-v #66

Merged
merged 1 commit into from
Mar 4, 2024
Merged

18-miniron-v #66

merged 1 commit into from
Mar 4, 2024

Conversation

miniron-v
Copy link
Member

@miniron-v miniron-v commented Feb 24, 2024

πŸ”— 문제 링크

https://www.acmicpc.net/problem/1300
1300번: K번째 수
λΆ„λ₯˜: 이뢄 탐색

βœ”οΈ μ†Œμš”λœ μ‹œκ°„

1μ‹œκ°„ 30λΆ„

✨ μˆ˜λ„ μ½”λ“œ

μ²˜μŒμ—” λΆ„μˆ˜μ°ΎκΈ° λ¬Έμ œμ™€ λΉ„μŠ·ν•˜λ‹€κ³  μƒκ°ν–ˆλ‹€.

2차원 λ°°μ—΄μ˜ λŒ€κ°μ„  쀄(i와 jκ°€ 같은 μˆ˜λ“€)을 κΈ°μ€€μœΌλ‘œ λŒ€κ°μ„ μ„ 그으면 항상 더 μž‘μ€ 숫자만 λ‚˜νƒ€λ‚˜λ‹ˆκΉŒ.

image

κ·Έλž˜μ„œ μ΄λ ‡κ²Œ ν‘œλ₯Ό κ·Έλ €λ΄€λŠ”λ°, λ‚΄ 생각이 ν‹€λ ΈμŒμ„ κΈˆμ„Έ μ•Œ 수 μžˆμ—ˆλ‹€. μ’Œμƒν–₯이 μž‘μ€ 건 λ§žμ§€λ§Œ, μš°ν•˜ν–₯이 항상 크진 μ•Šμ•˜κΈ°μ—.

κ·Έ ν›„ 문제 λΆ„λ₯˜κ°€ 이뢄 νƒμƒ‰μž„μ„ 보게 λ˜μ—ˆκ³ , κΈˆμ„Έ λ‘œμ§μ„ 지 수 μžˆμ—ˆλ‹€.

μœ„ λͺ¨μ–‘μ²˜λŸΌμ€ μ•ˆ λ˜μ§€λ§Œ, μ–΄λ–€ 수 upper보닀 μž‘μ€ μˆ˜κ°€ λͺ‡ κ°œμΈμ§€λŠ” μ‰½κ²Œ νŒŒμ•…ν•  수 μžˆλ‹€.

image

μœ„μ²˜λŸΌ, 각 행이 κ΅¬κ΅¬λ‹¨μ²˜λŸΌ μΌμ •ν•˜κ²Œ μ¦κ°€ν•˜κΈ° λ•Œλ¬Έμ—.

각 ν–‰μ˜ upperμ΄ν•˜ 수의 κ°œμˆ˜λŠ” upper / i(iλŠ” ν–‰ 번호)둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€. 예λ₯Ό λ“€μ–΄ μœ„ μ‚¬μ§„μ—μ„œ, upper = 6, i = 2라면 2번째 행에 6μ΄ν•˜ μˆ˜λŠ” 6 / 2 = 3κ°œμž„μ΄ μ‰½κ²Œ ꡬ해진닀.

이의 λ°˜λ‘€λ‘œ, μ΄λ ‡κ²Œ κ΅¬ν•œ 수의 κ°œμˆ˜λ³΄λ‹€ N이 더 μž‘λ‹€λ©΄ κ°œμˆ˜λŠ” Nκ°œκ°€ λœλ‹€. κ·ΈλŸ¬λ‹ˆ 이λ₯Ό μ½”λ“œλ‘œ λ‚˜νƒ€λ‚΄λ©΄

std::min(upper / i, n);

둜 λ‚˜νƒ€λ‚Ό 수 μžˆλ‹€.
이λ₯Ό λͺ¨λ“  행에 ν•΄μ£Όλ©΄, 전체 2차원 λ°°μ—΄μ—μ„œ upper μ΄ν•˜ 수의 개수λ₯Ό ꡬ할 수 μžˆλ‹€.

// [n][n] λ°°μ—΄μ—μ„œ upper μ΄ν•˜ 수의 개수λ₯Ό μ„Όλ‹€.
long countNum(long n, long upper) {
	long count = 0;

	for (long i = 1; i <= n && i <= upper; ++i) {
		count += std::min(upper / i, n);
	}

	return count;
}

for문에 2쀑 쑰건을 건 건 nκ³Ό upper 쀑 더 μž‘μ€ κ°’λ§ŒνΌλ§Œ 돌리기 μœ„ν•΄μ„œλ‹€. i <= n을 μ œκ±°ν•΄λ„ λ¬Έμ œλŠ” 잘 λŒμ•„κ°„λ‹€. λŒ€μ‹  0을 κ½€ 많이 λ”ν•˜κ²Œ λœλ‹€.

이후 upper의 값을 이뢄 탐색을 톡해 κ΅¬ν•˜λ©΄ λ¬Έμ œλŠ” 끝이닀.

πŸ“š 전체 μ½”λ“œ

#include <iostream>

// [n][n] λ°°μ—΄μ—μ„œ upper μ΄ν•˜ 수의 개수λ₯Ό μ„Όλ‹€.
long countNum(long n, long upper) {
	long count = 0;

	for (long i = 1; i <= n && i <= upper; ++i) {
		count += std::min(upper / i, n);
	}

	return count;
}

int main() {
	long n, k;
	std::cin >> n >> k;

	long low = 0, high = k;
	long mid = 0;

	while (low + 1 < high) {
		mid = (low + high) / 2;
		long count = countNum(n, mid);

		if (count < k) {
			low = mid;
		}

		else if (count >= k) {
			high = mid;
		}
	}

	std::cout << high;
}

πŸ“š μƒˆλ‘­κ²Œ μ•Œκ²Œλœ λ‚΄μš©

νƒœκ·œλ‹˜μ΄ μ˜ˆμ „μ— 곡유기 μ„€μΉ˜μ—μ„œ κ³΅μœ ν•΄μ£Όμ…¨λ˜ 이뢄 탐색 ν—·κ°ˆλ¦¬μ§€ μ•Šκ²Œ κ΅¬ν˜„ν•˜κΈ°λ₯Ό μ½κ³ λ‚œ ν›„, 이뢄 탐색 κ΅¬ν˜„μ΄ 맀우 μ‰¬μ›Œμ‘Œλ‹€. 논리도 κΉ”λ”ν•˜κ²Œ μ •λ¦¬λ˜μ—ˆκ³ .

μ‰¬μš΄ 문제인데 μƒλ‹Ήνžˆ μ‹œκ°„μ΄ 였래 κ±Έλ Έλ‹€. κ·Έ 뢀뢄은 λ°”λ‘œ long low = 0, high = k; μ—¬κΈ°μ˜€λ‹€.

μ²˜μŒμ—” λ‹Ήμ—°νžˆ, high = n * n + 1둜 λ‘μ—ˆλ‹€. 이것이 μ΅œλŒ€ 값이라고 μƒκ°ν–ˆκ³ , μ‹€μ œλ‘œ λͺ¨λ“  λ°˜λ‘€λ₯Ό ν†΅κ³Όν–ˆλ‹€. (μ΅œλŒ“κ°’μ„ λ„£μ—ˆμ„ λ•Œλ„ ν†΅κ³Όν–ˆλ‹€.)

그런데 45%μ—μ„œ 계속 ν‹€λ ΈμŠ΅λ‹ˆλ‹€κ°€ λ‚˜μ™”κ³ , high = k둜 λ°”κΎΌ 후에 κ°‘μžκΈ° μ„±κ³΅ν–ˆλ‹€.

λΉ„λ‘˜κΈ°μ§‘ μ›λ¦¬μ²˜λŸΌ kλ₯Ό λ„˜λŠ” 정닡이 μ•ˆ λ‚˜μ˜€λŠ” 건 μ•Œμ•˜μ§€λ§Œ, n * n + 1둜 μ„€μ •ν–ˆμ„ λ•Œ ν‹€λ¦¬λŠ” 이유λ₯Ό μ•Œ 수 μ—†μ—ˆλ‹€. long longμœΌλ‘œλ„ λ„£μ–΄λ΄€κ³ , λΆ„λͺ… λ²”μœ„ 내일텐데.

μ‹œκ°„ μ΄ˆκ³Όλ„ μ•„λ‹Œ ν‹€λ ΈμŠ΅λ‹ˆλ‹€λΌμ„œ κ·Έλ‚˜λ§ˆ μ˜μ‹¬κ°€λŠ” 건 수의 λ²”μœ„ 뿐인데... 아직도 잘 λͺ¨λ₯΄κ² λ‹€. N의 λ²”μœ„λŠ” $10^5$ μ΄ν•˜λ‹ˆ 끽해봐야 10,000,000,000 정도일 텐데. 이유λ₯Ό λͺ¨λ₯΄κ² λ‹€.

Copy link
Member

@bomik0221 bomik0221 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

λ¬Έμ œκ°€ μ›ν•˜λŠ” λ°”κ°€ 무엇인지 νŒŒμ•…ν•˜λŠ” 데만 ν•œμ°Έ κ±Έλ¦° 것 κ°™μ•„μš”! μ—­μ‹œ κ³¨λ“œ λ¬Έμ œλŠ” 문제 이해뢀터가 문제(?) κ°™μŠ΅λ‹ˆλ‹€..γ…Žγ…Ž
이뢄 탐색 κ°œλ…μ€ μ•Œκ³  μžˆμ§€λ§Œ μ½”λ“œλ‘œ 보면 아직은 μƒμ†Œν•œ λΆ„μ•Ό κ°™μ•„μš”. 저도 링크해주신 κΈ€ 읽고 λ ˆλ²¨μ—… ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€! μ½”λ“œ 잘 λ΄€μŠ΅λ‹ˆλ‹€πŸ˜„

long count = 0;

for (long i = 1; i <= n && i <= upper; ++i) {
count += std::min(upper / i, n);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

n*n λ°°μ—΄ 없이 μ–΄λ–»κ²Œ 값을 찾지? λΌλŠ” 생각을 ν–ˆμ—ˆλŠ”λ° μ‹ κΈ°ν•˜λ„€μš”..

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 λ¬Έμ œλŠ” NxN 배열을 λ§Œλ“€κ³ , 1차원 λ°°μ—΄λ‘œ λ°”κΎΌ λ’€ μ˜€λ¦„μ°¨μˆœ μ •λ ¬κΉŒμ§€ ν•˜κΈ° λ•Œλ¬Έμ— 2차원 배열을 μ“°λŠ” 게 더 ν—€λ©œ 것 κ°™μ•„μš”.

Copy link
Collaborator

@2secondag 2secondag left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 λ³΄λ―Έλ‹˜μ΄λž‘ 같이 N*N 배열을 λ§Œλ“€μ§€ μ•Šκ³  닡을 찾을 수 μžˆλ‹€λŠ” 점이 μ‹ κΈ°ν–ˆμŠ΅λ‹ˆλ‹€....! μΆ”κ°€λ‘œ κ³΅μœ ν•΄μ£Όμ‹  이뢄 탐색 κ΅¬ν˜„ν•˜κΈ°λ„ λ‚˜μ€‘μ— 읽어보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€~

문제 μ„€λͺ…뢀뢄에 λ°˜λ‘€λ‘œ, μ΄λ ‡κ²Œ κ΅¬ν•œ 수의 κ°œμˆ˜λ³΄λ‹€ N이 더 μž‘λ‹€λ©΄ κ°œμˆ˜λŠ” Nκ°œκ°€ λœλ‹€. λΌλŠ” 뢀뢄이 μžˆλŠ”λ° ν˜Ήμ‹œ λ°˜λ‘€μ˜ μ˜ˆμ‹œκ°€ μžˆμ„κΉŒμš”?!

@miniron-v
Copy link
Member Author

저도 λ³΄λ―Έλ‹˜μ΄λž‘ 같이 N*N 배열을 λ§Œλ“€μ§€ μ•Šκ³  닡을 찾을 수 μžˆλ‹€λŠ” 점이 μ‹ κΈ°ν–ˆμŠ΅λ‹ˆλ‹€....! μΆ”κ°€λ‘œ κ³΅μœ ν•΄μ£Όμ‹  이뢄 탐색 κ΅¬ν˜„ν•˜κΈ°λ„ λ‚˜μ€‘μ— 읽어보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€~

문제 μ„€λͺ…뢀뢄에 λ°˜λ‘€λ‘œ, μ΄λ ‡κ²Œ κ΅¬ν•œ 수의 κ°œμˆ˜λ³΄λ‹€ N이 더 μž‘λ‹€λ©΄ κ°œμˆ˜λŠ” Nκ°œκ°€ λœλ‹€. λΌλŠ” 뢀뢄이 μžˆλŠ”λ° ν˜Ήμ‹œ λ°˜λ‘€μ˜ μ˜ˆμ‹œκ°€ μžˆμ„κΉŒμš”?!

κ°„λ‹¨νžˆ N이 4, Kκ°€ 12인 경우λ₯Ό 예둜 λ“€μ–΄λ³ΌκΉŒμš”?

μ΄λ•Œ 두 번째 쀄은 2, 4, 6, 8, 총 4κ°œκ°€ μžˆλŠ”λ°μš”
곡식에 따라 개수λ₯Ό ꡬ해보면 12 / 2 = 6개라고 λ‚˜μ˜΅λ‹ˆλ‹€.

μ΄λ•Œ λ‚˜λ¨Έμ§€ 2개(10, 12)λŠ” N칸을 λ²—μ–΄λ‚˜ 사라진 λΆ€λΆ„μ΄λ―€λ‘œ, λ‘˜ 쀑 μž‘μ€ 값을 μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

λ°˜λŒ€λ‘œ λ„€ 번째 쀄은 N이 4, κ°œμˆ˜κ°€ 3μ΄λ‹ˆ 3을 골라야 맞겠죠?

@miniron-v miniron-v merged commit c769928 into main Mar 4, 2024
1 check passed
@miniron-v miniron-v deleted the 18-miniron-v branch March 4, 2024 13:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants